Lab 3 -
Behavioural VHDL -- Part 2
Цел
|
Придобиване на практически опит за разработване на
поведенчески VHDL модели.
|
Задание |
Да се
разработят поведенчески VHDL модели на различни цифрови схеми.
Да се провери корекността на моделите посредством
симулация. |
Задача 5 --
Генератор на бит за нечетност (оператор for-loop)
Да се разработи поведенчески VHDL модел на
8-битов генератор на бит за нечетност (фигура 5.1).
|
Фигура 5.1 --
Схема на генератор на бит за нечетност |
|
|
Описанието на изводите на генератора е дадено в
Таблица 1.
| Таблица 5.1
|
| Сигнал |
Тип |
Посока |
Функция |
| D |
STD_LOGIC_VECTOR (7 downto 0) |
вход |
Данни,
за които се изчислява бит за нечетност
|
| ODD |
STD_LOGIC |
изход |
Сигнал
за нечетност - приема стойност '1' когато броя на единиците
във входните данни D е нечетен.
|
На фигура 5.2 е даден VHDL модела на генератор
на бит за нечетност (odd8.vhd).
Разгледайте дадения модел и се уверете, че разбирате смисъла на VHDL
конструкциите в него.
|
Фигура 5.2 --
Поведенчески модел на генератор на бит за нечетност
|
library ieee;
use ieee.std_logic_1164.all;
entity oddParityLoop is
port (D: in std_logic_vector (7 downto 0);
ODD : out std_logic ) ;
end oddParityLoop ;
architecture arch1 of oddParityLoop is
begin
process (D)
variable tmp: std_logic;
begin
tmp := '0';
for i in 0 to 7 loop
tmp := tmp xor D( i ) ;
end loop ;
ODD <= tmp;
end process;
end arch1 ;
|
Да се разработи подходяща тестова установка и да
се симулира модела.
Задача 6 --
Параметризиран модел на генератор на бит за нечетност (оператор
for-loop)
Да се разработи параметризиран вариант на модела
от задача 5. Разрядността на входната шина D да се задава
посредством параметър N.
|
Указание

|
Пример за използването на generic
параметри може да се види в Lab 2 -- Part 2 |
Задача 7 --
Регистров файл (оператор for-loop)
Регистровия файл представлява набор от регистри,
в които се съхраняват данни. Да се разработи поведенчески VHDL модел
на регистров файл състоящ се от четири 32-битови регистъра.
Входно/изходните сигнали са дадени в Таблица 7.1.
| Таблица 7.1
|
| Сигнал |
Тип |
Посока |
Функция |
| DATA_IN |
STD_LOGIC_VECTOR (31 downto 0) |
вход |
Входна
магистрала за данни |
| ADDR |
STD_LOGIC_VECTOR (1 downto 0) |
вход |
Адрес за
избор на регистър от регистровия файл
|
| WRITE |
STD_LOGIC |
вход |
При
WRITE='1' е разрешен записа в избрания регистър. |
| CLK |
STD_LOGIC |
вход |
Тактов
сигнал. По неговия нарастващ фронт се синхронизира записа в
регистровия файл. |
| RST |
STD_LOGIC |
вход |
Асинхронно нулиране при ниско ниво. |
| DATA_OUT |
STD_LOGIC_VECTOR (31 downto 0) |
изход |
Изходна
магистрала за данни.
|
На фигура 7.1 е даден VHDL модела на регистровия
файл (regfile.vhd).
Разгледайте дадения модел и се уверете, че разбирате смисъла на VHDL
конструкциите в него. Обърнете внимание на използването на оператор
for-loop за нулиране на регистрите.
|
Фигура 7.1 --
Поведенчески модел на регистров файл
|
library IEEE;
use IEEE.std_logic_1164.all;
entity regFile is port (
CLK, RST: in std_logic;
DATA_IN: in std_logic_vector(31 downto 0);
ADDR: in std_logic_vector(1 downto 0);
WRITE: in std_logic;
DATA_OUT: out std_logic_vector(31 downto 0)
);
end regFile;
architecture behavioral of regFile is
subtype reg is std_logic_vector(31 downto 0);
type regArray is array (integer range <>) of reg;
signal registerFile: regArray(0 to 3);
begin
regProc: process (CLK, RST)
begin
if RST = '1' then
for i in registerFile'range loop
registerFile(i) <= (others => '0');
end loop;
elsif CLK'event and CLK = '1' then
if (WRITE = '1') then
case ADDR is
when "00" =>
registerFile(0) <= DATA_IN;
when "01" =>
registerFile(1) <= DATA_IN;
when "10" =>
registerFile(2) <= DATA_IN;
when "11" =>
registerFile(3) <= DATA_IN;
when others =>
null;
end case;
end if;
end if;
end process;
outputs: process(ADDR, registerFile) begin
case ADDR is
when "00" =>
DATA_OUT <= registerFile(0);
when "01" =>
DATA_OUT <= registerFile(1);
when "10" =>
DATA_OUT <= registerFile(2);
when "11" =>
DATA_OUT <= registerFile(3);
when others =>
null;
end case;
end process;
end behavioral;
|
Да се разработи подходяща тестова установка и да
се симулира модела.
Задача 8 --
Регистров файл -- Вариант с двупосочна шина за данни
Да се разработи модифициран вариант на модела от
задача 7 като данните се записват/четат от регистровия файл
посредством двупосочна шина DATA. Избор на режим четене/запис
се определя от сигнала RW (виж таблица 8.1).
| Таблица 8.1
|
| Сигнал |
Тип |
Посока |
Функция |
| DATA |
STD_LOGIC_VECTOR (31 downto 0) |
вход/изход |
Входно/изходна шина за данни
|
| ADDR |
STD_LOGIC_VECTOR (1 downto 0) |
вход |
Адрес за
избор на регистър от регистровия файл
|
| RW |
STD_LOGIC |
вход |
Определя
режим на работа: RW='1' -- четене, RW='0' -- запис. |
| CLK |
STD_LOGIC |
вход |
Тактов
сигнал. По неговия нарастващ фронт се синхронизира записа в
регистровия файл. |
| RST |
STD_LOGIC |
вход |
Асинхронно нулиране при ниско ниво. |
|
Указания
|
- Използвайте посока inout при описанието
на сигнала DATA.
- За да се избегнат конфликти в шината
DATA изходите на регистровия файл трябва да бъдат с три
състояния. За целта използвайте следната VHDL
конструкция:
outputs: process(RW, ADDR, registerFile) begin
if(RW = '1') then
case ADDR is
when "00" =>
DATA <= registerFile(0);
when "01" =>
DATA <= registerFile(1);
when "10" =>
DATA <= registerFile(2);
when "11" =>
DATA <= registerFile(3);
when others =>
null;
end case;
else
DATA <= (others =>'Z');
end if;
end process; | |